﻿using System.Collections.Generic;
using System.Linq;

namespace netCoreStudy.Helper
{
	/// <summary>
	/// 泛型递归求树形结构
	/// </summary>
	public static class RecursionHelper
	{
		public static void LoopToAppendChildren(List<PermissionTree> all, PermissionTree curItem, int pid, bool needbtn)
		{
			var subItems = all.Where(ee => ee.Pid == curItem.value).ToList();

			var btnItems = subItems.Where(ss => ss.isbtn == true).ToList();
			if (subItems.Count > 0)
			{
				curItem.btns = new List<PermissionTree>();
				curItem.btns.AddRange(btnItems);
			}
			else
			{
				curItem.btns = null;
			}

			if (!needbtn)
			{
				subItems = subItems.Where(ss => ss.isbtn == false).ToList();
			}

			if (subItems.Count > 0)
			{
				curItem.children = new List<PermissionTree>();
				curItem.children.AddRange(subItems);
			}
			else
			{
				curItem.children = null;
			}

			if (curItem.isbtn)
			{
				//curItem.label += "按钮";
			}

			foreach (var subItem in subItems)
			{
				if (subItem.value == pid && pid > 0)
				{
					//subItem.disabled = true;//禁用当前节点
				}

				LoopToAppendChildren(all, subItem, pid, needbtn);
			}
		}


		public static void LoopNaviBarAppendChildren(List<NavigationBar> all, NavigationBar curItem)
		{
			var subItems = all.Where(ee => ee.pid == curItem.id).ToList();

			if (subItems.Count > 0)
			{
				curItem.children = new List<NavigationBar>();
				curItem.children.AddRange(subItems);
			}
			else
			{
				curItem.children = null;
			}


			foreach (var subItem in subItems)
			{
				LoopNaviBarAppendChildren(all, subItem);
			}
		}


		public static void LoopToAppendChildrenT<T>(List<T> all, T curItem, string parentIdName = "Pid",
			string idName = "value", string childrenName = "children")
		{
			var subItems = all.Where(ee =>
				ee.GetType().GetProperty(parentIdName).GetValue(ee, null).ToString() ==
				curItem.GetType().GetProperty(idName).GetValue(curItem, null).ToString()).ToList();

			if (subItems.Count > 0) curItem.GetType().GetField(childrenName).SetValue(curItem, subItems);
			foreach (var subItem in subItems)
			{
				LoopToAppendChildrenT(all, subItem);
			}
		}
	}

	public class PermissionTree
	{
		public long value { get; set; }
		public long Pid { get; set; }
		public string label { get; set; }
		public int order { get; set; }
		public bool isbtn { get; set; }
		public bool disabled { get; set; }
		public List<PermissionTree> children { get; set; }
		public List<PermissionTree> btns { get; set; }
	}

	public class NavigationBar
	{
		public long id { get; set; }
		public long pid { get; set; }
		public long order { get; set; }
		public string name { get; set; }
		public bool IsHide { get; set; } = false;
		public bool IsButton { get; set; } = false;
		public string path { get; set; }
		public string Func { get; set; }
		public string iconCls { get; set; }
		public NavigationBarMeta meta { get; set; }
		public List<NavigationBar> children { get; set; }
	}

	public class NavigationBarMeta
	{
		public string title { get; set; }
		public bool requireAuth { get; set; } = true;
		public bool NoTabPage { get; set; } = false;
		public bool keepAlive { get; set; } = false;
	}
}